package org.jboss.resteasy.test.client; import org.apache.commons.io.IOUtils; import org.jboss.resteasy.client.jaxrs.ResteasyClient; import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder; import org.jboss.resteasy.test.client.resource.NoContentStreamingCloseTestFilter; import org.jboss.resteasy.test.client.resource.NoContentStreamingCloseTestInputStream; import org.jboss.resteasy.test.client.resource.NoContentStreamingCloseTestResponse; import org.junit.Assert; import org.junit.Test; import javax.activation.DataSource; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; import java.io.InputStream; import java.io.Reader; /** * @tpSubChapter Resteasy-client * @tpChapter Unit tests * @tpSince RESTEasy 3.0.16 * @tpTestCaseDetails Test for close calling, if no content in stream is used. */ public class NoContentStreamingCloseTest { private static final String NULL_STREAM_ERROR_MSG = "Stream should not be null"; private static final String RESPONSE_ERROR_MSG = "Response has wrong content"; private static final String CLOSE_ERROR_MSG = "Object was not closed"; /** * @tpTestDetails Non-empty input stream test. * @tpSince RESTEasy 3.0.16 */ @Test public void testNonEmptyInputStream() throws Exception { String expected = "hi"; NoContentStreamingCloseTestInputStream testInputStream = new NoContentStreamingCloseTestInputStream(expected.getBytes()); ResteasyClient client = new ResteasyClientBuilder() // .register(new NoContentStreamingCloseTestFilter(NoContentStreamingCloseTestResponse.buildStreamingResponse(testInputStream, -1))) // .build(); InputStream is = client // .target("http://localhost/uri_is_ignored") // .request() // .get(InputStream.class); // nowhere a response to close Assert.assertNotNull(NULL_STREAM_ERROR_MSG, is); String str = new String(IOUtils.toByteArray(is)); is.close(); Assert.assertEquals(RESPONSE_ERROR_MSG, expected, str); // the stream returned by the internal httpclient must be closed! Assert.assertTrue(CLOSE_ERROR_MSG, testInputStream.isClosed()); client.close(); } /** * @tpTestDetails Empty input stream test. * @tpSince RESTEasy 3.0.16 */ @Test public void testEmptyInputStream() throws Exception { NoContentStreamingCloseTestInputStream testInputStream = new NoContentStreamingCloseTestInputStream(new byte[0]); ResteasyClient client = new ResteasyClientBuilder() // .register(new NoContentStreamingCloseTestFilter(NoContentStreamingCloseTestResponse.buildStreamingResponse(testInputStream, 0))) // .build(); InputStream is = client // .target("http://localhost/uri_is_ignored") // .request() // .get(InputStream.class); Assert.assertNotNull(NULL_STREAM_ERROR_MSG, is); byte[] readden = IOUtils.toByteArray(is); is.close(); Assert.assertEquals(RESPONSE_ERROR_MSG, 0, readden.length); Assert.assertTrue(CLOSE_ERROR_MSG, testInputStream.isClosed()); client.close(); } /** * @tpTestDetails Empty Reader test. * @tpSince RESTEasy 3.0.16 */ @Test public void testEmptyReader() throws Exception { NoContentStreamingCloseTestInputStream testInputStream = new NoContentStreamingCloseTestInputStream(new byte[0]); ResteasyClient client = new ResteasyClientBuilder() // .register(new NoContentStreamingCloseTestFilter(NoContentStreamingCloseTestResponse.buildStreamingResponse(testInputStream, 0))) // .build(); Reader in = client // .target("http://localhost/uri_is_ignored") // .request() // .get(Reader.class); Assert.assertNotNull("Reader should not be null", in); String readden = IOUtils.toString(in); in.close(); Assert.assertEquals(RESPONSE_ERROR_MSG, 0, readden.length()); Assert.assertTrue(CLOSE_ERROR_MSG, testInputStream.isClosed()); client.close(); } /** * @tpTestDetails Empty DataSource test. * @tpSince RESTEasy 3.0.16 */ @Test public void testEmptyDataSource() throws Exception { NoContentStreamingCloseTestInputStream testInputStream = new NoContentStreamingCloseTestInputStream(new byte[0]); ResteasyClient client = new ResteasyClientBuilder() // .register(new NoContentStreamingCloseTestFilter(NoContentStreamingCloseTestResponse.buildStreamingResponse(testInputStream, 0))) // .build(); DataSource in = client // .target("http://localhost/uri_is_ignored") // .request() // .get(DataSource.class); Assert.assertNotNull("DataSource should not be null", in); InputStream is = in.getInputStream(); Assert.assertEquals(RESPONSE_ERROR_MSG, 0, IOUtils.toByteArray(is).length); is.close(); Assert.assertTrue(CLOSE_ERROR_MSG, testInputStream.isClosed()); client.close(); } /** * @tpTestDetails Empty Stream source test. * @tpSince RESTEasy 3.0.16 */ @Test public void testEmptyStreamSource() throws Exception { NoContentStreamingCloseTestInputStream testInputStream = new NoContentStreamingCloseTestInputStream(new byte[0]); ResteasyClient client = new ResteasyClientBuilder() // .register(new NoContentStreamingCloseTestFilter( // NoContentStreamingCloseTestResponse.buildStreamingResponse("application/streamsource+xml", testInputStream, 0))) // .build(); Source in = client // .target("http://localhost/uri_is_ignored") // .request() // .get(Source.class); Assert.assertNotNull("Source should not be null", in); InputStream is = ((StreamSource) in).getInputStream(); Assert.assertEquals(RESPONSE_ERROR_MSG, 0, IOUtils.toByteArray(is).length); is.close(); Assert.assertTrue(CLOSE_ERROR_MSG, testInputStream.isClosed()); client.close(); } /** * @tpTestDetails Empty Byte array source test. * @tpSince RESTEasy 3.0.16 */ @Test public void testEmptyByteArray() throws Exception { NoContentStreamingCloseTestInputStream testInputStream = new NoContentStreamingCloseTestInputStream(new byte[0]); ResteasyClient client = new ResteasyClientBuilder() // .register(new NoContentStreamingCloseTestFilter(NoContentStreamingCloseTestResponse.buildStreamingResponse(testInputStream, 0))) // .build(); byte[] in = client // .target("http://localhost/uri_is_ignored") // .request() // .get(byte[].class); Assert.assertNotNull("Byte array should not be null", in); Assert.assertEquals(RESPONSE_ERROR_MSG, 0, in.length); Assert.assertTrue(CLOSE_ERROR_MSG, testInputStream.isClosed()); client.close(); } }